'''
# -*- coding:utf-8 -*-
# @Project: DevOps_api
# @Date: 2023/3/13 - 21:33
# @Author: ysg
# @Describe: 

Ops_exceptions.py
'''

from rest_framework.views import exception_handler
from utils.Ops_responses import OpsResponse
from settings import start_code
from utils.Ops_logger import logger


def ops_exception_handler(exc, context):
    request = context.get('request')
    try:
        username = request.users.pk
        if not username:
            username = '匿名用户'
    except:
        username = '匿名用户'
    err_msg = f"登录用户id: {username}|用户ip: {request.META.get('REMOTE_ADDR')}|请求方式: {request.method}|请求地址: {request.path}|执行的视图类: {context.get('view')}|错误原因: {exc.__str__()}"
    logger.warning(err_msg)
    # 统一返回格式
    response = exception_handler(exc, context)  # 内置的这个异常处理函数，只处理了 drf 自己的异常(继承了了APIException的异常)
    if response:  # 如果 response 有值，说明错误被处理了(Http404,PermissionDenied,APIException)
        return OpsResponse(code=start_code.DRF_ERROR, msg=f'drf 报错了{response.data.get("detail", "未知报错")}')
    else:  # 如果是 None，这个错误没有被处理，说明这个错误不是 drf 的错误，而是 django 的或代码的错误
        return OpsResponse(code=start_code.DJANGO_ERROR, msg=f'系统报错了{exc.__str__()}')
